package com.sgcc.pda.lib_tools_database.db;

import android.content.Context;
import android.text.TextUtils;

import com.sgcc.pda.lib_tools_database.DBMaster;
import com.sgcc.pda.lib_tools_database.gen.DaoMaster;
import com.sgcc.pda.lib_tools_database.gen.DaoSession;
import com.sgcc.pda.lib_tools_database.util.DataBaseConfigTools;
import com.sgcc.pda.tools.LogPrintUtils;
import com.sgcc.pda.tools.SPUtils;

import org.greenrobot.greendao.query.QueryBuilder;

import java.io.IOException;

import static com.sgcc.pda.lib_tools_database.comment.DBConstant.DB_ENCRYP;
import static com.sgcc.pda.lib_tools_database.comment.DBConstant.DEFAULT_DB_NAME;
import static com.sgcc.pda.lib_tools_database.comment.DBConstant.DEFAULT_USER_ID;
import static com.sgcc.pda.lib_tools_database.gen.DaoMaster.SCHEMA_VERSION;

/**
 * 数据库管理，数据库初始化入口
 */
public class DBCore {

    private Context mContext;       //上下文
    private String mDbName;         //得到数据库的名字的字段
    private String mUserId;         //一般用来针对一个用户一个数据库，以免数据混乱问题
    private DaoMaster mDaoMaster;   //数据库的管理者
    private DaoSession mDaoSession; //此对象是对数据库进行增删改查的
    private DevOpenHelper mHelper;

    /**
     * 数据库版本号
     */
    private int mVersion = SCHEMA_VERSION;

    public DBCore() {}

    /**
     * 数据库初始化
     *
     * @param userId 用户id  一般用来针对一个用户一个数据库，以免数据混乱问题
     */
    public void initCore(String userId) {
        if (null == DBMaster.getSingleton().getContext()) {
            throw new IllegalArgumentException("初始化出错，上下文为空");
        }
        mContext = DBMaster.getSingleton().getContext();
        mDbName = DEFAULT_DB_NAME;
        if (TextUtils.isEmpty(userId)) {
            mUserId = DEFAULT_USER_ID;
        } else {
            mUserId = userId;
        }
        SPUtils.init(mContext, mUserId);
        try {
            String versionStr = DataBaseConfigTools.readInfo(this.mUserId);
            int version = Integer.parseInt(versionStr);
            if (SCHEMA_VERSION > version) {
                DataBaseConfigTools.createText(mUserId, "");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 动态定义版本号
     */
    public void setVersion(int version) {
        this.mVersion = version;
    }

    /**
     * 得到数据库加密的管理类
     */
    private DaoMaster getmDaoMasterEncryption() {
        try {
            int version = 0;
            try {
                String versionStr = DataBaseConfigTools.readInfo(mUserId);
                version = Integer.parseInt(versionStr);
                if (version > SCHEMA_VERSION ){
                    mHelper = null;
                }
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
            if (mHelper == null) {
                if (DBMaster.getSingleton().isPlugin()) {
                    //插件模式下用插件的Context会提示找不到so文件
                    if (null == DBMaster.getSingleton().getHostContext()) {
                        throw new IllegalArgumentException("初始化出错，插件模式下宿主APP上下文为空");
                    }
                    mHelper = new DBOpenHelper(new DBWrapper(DBMaster.getSingleton().getHostContext(), mUserId), mDbName, version > SCHEMA_VERSION ? version : SCHEMA_VERSION, mUserId);
                } else {
                    mHelper = new DBOpenHelper(new DBWrapper(mContext, mUserId), mDbName, version > SCHEMA_VERSION ? version : SCHEMA_VERSION, mUserId);
                }
            }
            mHelper.setLoadSQLCipherNativeLibs(false);
            try {
                System.load("/.platform/data/lib/libsqlcipher.so");
                //使用加密方式
                if (mDaoMaster == null) {
                    mDaoMaster = new DaoMaster(mHelper.getEncryptedReadableDb(DB_ENCRYP));
                }
            } catch (Throwable e) {
                //不使用加密，仅作为异常处理的手段，不至于应用无法使用
                mDaoMaster = new DaoMaster(mHelper.getWritableDatabase());
            }
        } catch (Exception e) {
            LogPrintUtils.e(e);
        }
        return mDaoMaster;
    }

    /**
     * 得到数据库加密的管理类
     */
    public DaoSession getDoaSessionEncryption() {
        if (mDaoSession == null) {
            if (mDaoMaster == null) {
                mDaoMaster = getmDaoMasterEncryption();
            }
            mDaoSession = mDaoMaster.newSession();
        }
        return mDaoSession;
    }

    /**
     * 在 QueryBuilder 类中内置两个 Flag 用于方便输出执行的 SQL 语句与传递参数的值
     */
    public void enableQueryBuilderLog() {
        QueryBuilder.LOG_SQL = true;
        QueryBuilder.LOG_VALUES = true;
    }

    /**
     * 关闭所有的操作，数据库开启后，使用完毕要关闭
     */
    public void closeConnection() {
        closeHelper();
        closeDaoSession();
    }

    public void closeHelper() {
        if (mHelper != null) {
            mHelper.close();
            mHelper = null;
        }
    }

    public void closeDaoSession() {
        if (mDaoSession != null) {
            mDaoSession.clear();
            mDaoSession = null;
        }
    }

}
